#ifndef GRADIANT_HPP
#define GRADIANT_HPP

//------------------------------------------------------------------------------
// Fichier d'entête utilisés
//------------------------------------------------------------------------------
#include "Layer.hpp"
#include "Histogram.hpp"
#include "Mask.hpp"
#include "Orientation.hpp"

namespace ImageAnalysis
{
//----------------------------------------------------------------------
// Cette classe correspond au gradiant calculé sur une image
// en niveaux de gris. Elle contient pour chaque pixel de l'image
// la norme du gradient et son orientation.
//----------------------------------------------------------------------
class Gradiant : public Layer
{
public:
	//----------------------------------------------------------------------
	// Structure
	//----------------------------------------------------------------------
	
	//----------------------------------------------------------------------
	// Constructeur
	//----------------------------------------------------------------------
	Gradiant( int width, int height );
	
	//----------------------------------------------------------------------
	// Destructeur
	//----------------------------------------------------------------------
	virtual ~Gradiant();
	
	//----------------------------------------------------------------------
	// Permet de récupérer la valeur de la norme du gradient
	// pour un pixel donné.
	// Contrat : l'index doit correspondre à un pixel.
	//----------------------------------------------------------------------
	virtual unsigned char GetGradiantNorm( int index );
	
	//----------------------------------------------------------------------
	// Permet de récupérer l'orientation du gradiant 
	// pour un pixel donné.
	//Contrat : l'index doit correspondre à un pixel.
	//----------------------------------------------------------------------
	virtual float GetGradiantOrientation( int index );
	
	//----------------------------------------------------------------------
	// Permet de récupérer la direction du gradiant (approximée
	// à partir de l'angle d'orientation).
	//Contrat : l'index doit correspondre à un pixel.
	//----------------------------------------------------------------------
	Orientation::TDirection GetGradiantApproximatedOrientation( int index );
	
	//----------------------------------------------------------------------
	// Permet de fixer la valeur de la norme du gradient 
	// d'un pixel.
	// Contrat : l'index doit correspondre à un pixel.
	//----------------------------------------------------------------------
	virtual void SetGradiantNorm( int index, unsigned char norm );
	
	//----------------------------------------------------------------------
	// Permet de fixer la valeur de l'orientation du gradient
	// d'un pixel.
	// Contrat : l'index doit correspondre à un pixel.
	//----------------------------------------------------------------------
	virtual void SetGradiantOrientation( int index, float orientation );
	
	//----------------------------------------------------------------------
	// Permet de calculer l'histogramme des niveaux de gris
	// d'une région de l'image.
	//----------------------------------------------------------------------
	Histogram* GetHistogram( Region* region );
	
	//----------------------------------------------------------------------
	// Permet de dessiner l'image du gradiant
	//----------------------------------------------------------------------
	virtual void Draw();
	

private:
	//----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
	unsigned char * gradiantNorms;
	float * gradiantOrientations;
	Orientation::TDirection* gradiantApproximateOrientations;

        //----------------------------------------------------------------------
        // Constructeur par copie et oprérateur d'affectation en privée pour
        // interdire leur utilisation
        //----------------------------------------------------------------------
        Gradiant( const Gradiant& copy);
        Gradiant& operator=( const Gradiant& copy );
};

}

#endif //GRADIANT_HPP
